package 进阶阶段;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class demo28TCP通信程序_客户端 {
    public static void main(String[] args) throws IOException {
        //先启动服务器，后启动客户端，就可以实现类似QQ的通话

        //两端通信步骤：
        //1. 服务端程序，需要事先启动，等待客户端的连接。
        //2. 客户端主动连接服务器端，连接成功才能通信。服务端不可以主动连接客户端。

        //客户端：Socket类表示。创建Socket对象，向服务端发出连接请求，服务端响应请求，两者建立连接开始通信。

        //Socket类：该类实现客户端套接字，套接字,指的是两台设备之间通讯的端点。通过调用io流来实现设备间的通信,数据交换,网络中通信,其实是套接字之间的通信,底层用的是io流
            //Socket(String host, int port):创建套接字对象,并将其连接到,指定主机上(服务器)的ip,指定(服务器)的端口号。如果指定的host字符串的是null(即String host = null;) ，则相当于指定地址为回送地址。

            //getInputStream()：返回此套接字的输入流,读取服务器写过来的数据
                //如果此Scoket具有相关联的通道，则生成的InputStream 的所有操作,也关联该通道。
                //关闭生成的InputStream,也将关闭相关的Socket。

            //getOutputStream()：返回此套接字的输出流,把数据写到服务器
                //如果此Scoket具有相关联的通道，则生成的OutputStream 的所有操作,也关联该通道。
                //关闭生成的OutputStream,也将关闭相关的Socket。

            //close()：关闭此套接字。关闭客户端//网络关闭
                //一旦一个socket被关闭，它不可再使用。
                //关闭此socket,也将关闭相关的InputStream和OutputStream 。

            //shutdownOutput()：禁用此套接字客户端的输出流。//单独关闭流,网络没有关闭
                //任何先前写出的数据将被发送到服务器，随后终止输出流。

        //客户端向服务器发送数据
//        Socket client = new Socket("localhost" , 6666);
//
//        //写入
//        OutputStream os = client.getOutputStream();
////        os.write("在吗？".getBytes());
//        os.write(new Scanner(System.in).nextLine().getBytes());//控制台输入
//
//        //读取
//        InputStream is = client.getInputStream();
//        byte[] arr = new byte[1024];
//        int read = is.read(arr);
//        System.out.println(new String(arr , 0 , read));
//
////        os.write("今天有空吗？".getBytes());
//        os.write(new Scanner(System.in).nextLine().getBytes());
//
//        client.close();

        System.out.println("----------------------------------------");
        System.out.println("写死循环重复接受和发送信息");

        while (true){
            //客户端向服务器发送数据
            Socket client1 = new Socket("localhost" , 6666);

            //写入
            OutputStream os1 = client1.getOutputStream();
            os1.write(new Scanner(System.in).nextLine().getBytes());//控制台输入

            //读取
            InputStream is1 = client1.getInputStream();
            byte[] arr1 = new byte[1024];
            int read1 = is1.read(arr1);
            System.out.println(new String(arr1, 0 , read1));

            client1.close();
        }

    }
}
